"""
为ResumeParseData模型生成测试数据的管理命令

使用方法：
python manage.py generate_test_data

选项：
--count: 生成的测试数据数量（默认5条）
"""

from django.core.management.base import BaseCommand
from django.db import transaction
from django.contrib.auth import get_user_model
from user.models import User, JobInfo
from home.models import Jobposting
from job.models import ResumeParseData
import random
import json
from datetime import datetime, timedelta

# 获取用户模型
UserModel = get_user_model()

class Command(BaseCommand):
    help = '为ResumeParseData模型生成测试数据'

    def add_arguments(self, parser):
        parser.add_argument(
            '--count',
            type=int,
            default=5,
            help='生成的测试数据数量（默认5条）',
        )

    def handle(self, *args, **options):
        count = options['count']
        
        # 检查是否存在必要的数据
        if User.objects.count() == 0:
            self.stdout.write(
                self.style.ERROR('错误: 数据库中没有用户数据，请先创建用户数据')
            )
            return
            
        if JobInfo.objects.count() == 0:
            self.stdout.write(
                self.style.ERROR('错误: 数据库中没有求职者信息数据，请先创建求职者信息数据')
            )
            return
            
        if Jobposting.objects.count() == 0:
            self.stdout.write(
                self.style.ERROR('错误: 数据库中没有职位信息数据，请先创建职位信息数据')
            )
            return

        # 开始事务
        with transaction.atomic():
            created_count = 0
            for i in range(count):
                try:
                    # 随机选择一个JobInfo和Jobposting
                    job_info = JobInfo.objects.order_by('?').first()
                    job_posting = Jobposting.objects.order_by('?').first()
                    
                    # 生成测试技能数据
                    skills_data = self._generate_skills_data()
                    
                    # 生成测试工作经历数据
                    work_experience_data = self._generate_work_experience_data()
                    
                    # 生成学历信息
                    education_text = random.choice([
                        '本科', '硕士', '博士', '大专', '高中', '中专'
                    ])
                    
                    # 创建ResumeParseData对象
                    resume_parse_data = ResumeParseData.objects.create(
                        jobinfo=job_info,
                        jobsposting=job_posting,
                        parse_text=f"这是第{i+1}条测试简历解析数据的文本内容",
                        skills=skills_data,
                        work_experience=work_experience_data,
                        education=education_text,
                    )
                    
                    self.stdout.write(
                        self.style.SUCCESS(f'成功创建测试数据: {resume_parse_data.id}')
                    )
                    created_count += 1
                    
                except Exception as e:
                    self.stdout.write(
                        self.style.ERROR(f'创建第{i+1}条测试数据时出错: {str(e)}')
                    )
            
            self.stdout.write(
                self.style.SUCCESS(f'总共创建了 {created_count} 条测试数据')
            )

    def _generate_skills_data(self):
        """生成技能数据，格式为包含技能等级的字典"""
        skills_pool = [
            'Python', 'Java', 'JavaScript', 'React', 'Vue.js', 'Angular', 
            'Node.js', 'Django', 'Flask', 'Spring Boot', 'MySQL', 'PostgreSQL',
            'MongoDB', 'Redis', 'Docker', 'Kubernetes', 'AWS', 'Azure', 
            'Git', 'Jenkins', 'Linux', 'HTML', 'CSS', 'TensorFlow', 'PyTorch',
            'FASTAPI', 'CSS3', 'HTML5', 'Bootstrap', 'jQuery', 'TypeScript',
            'Next.js', 'Nuxt.js', 'Express', 'Koa', 'Electron', 'React Native',
            'Flutter', 'Swift', 'Kotlin', 'ReactVR', 'Unity3D', 'C#', 'C++',
            'Go', 'Rust', 'Scala', 'Elixir', 'Phoenix', 'Ruby', 'Rails',
            'PHP', 'Laravel', 'Symfony', 'Java Spring', 'MyBatis', 'Hibernate',
            'Oracle', 'SQL Server', 'SQLite', 'Cassandra', 'Neo4j', 'HBase',
            'Elasticsearch', 'Solr', 'Kibana', 'Logstash', 'Nginx', 'Apache',
            'Tomcat', 'Jboss', 'WebLogic', 'OpenShift', 'OpenStack', 'VMware',
            'Ansible', 'Puppet', 'Chef', 'Terraform', 'CloudFormation', 'Prometheus',
            'Grafana', 'Zabbix', 'Splunk', 'Datadog', 'New Relic', 'AppDynamics',
            'Selenium', 'JMeter', 'LoadRunner', 'Postman', 'SoapUI', 'Cucumber',
            'Jenkins X', 'GitLab CI', 'Travis CI', 'CircleCI', 'Bamboo', 'TeamCity',
            'Maven', 'Gradle', 'Ant', 'SonarQube', 'Checkmarx', 'Fortify',
            'OAuth', 'JWT', 'SAML', 'OpenID Connect', 'LDAP', 'Active Directory',
            'TCP/IP', 'HTTP/HTTPS', 'DNS', 'DHCP', 'BGP', 'OSPF', 'MPLS',
            'Firewall', 'IDS/IPS', 'VPN', 'SIEM', 'DDoS防护', '渗透测试',
            '区块链', '以太坊', 'Hyperledger', '智能合约', 'Solidity', 'Web3.js',
            '机器学习', '深度学习', '自然语言处理', '计算机视觉', '数据挖掘', '强化学习'
        ]
        
        skill_levels = ['精通', '熟练', '了解', '基础']
        
        # 从技能池中随机选择最多100个技能
        selected_skills = random.sample(
            skills_pool, 
            min(100, len(skills_pool))
        )
        
        # 为每个技能分配一个等级
        skills_dict = {}
        for skill in selected_skills:
            skills_dict[skill] = random.choice(skill_levels)
        
        return skills_dict

    def _generate_work_experience_data(self):
        """生成工作经历数据"""
        companies = [
            '阿里巴巴', '腾讯', '百度', '字节跳动', '华为', '小米', 
            '京东', '美团', '拼多多', '滴滴', '网易', '携程'
        ]
        
        positions = [
            '软件工程师', '高级软件工程师', '项目经理', '产品经理', 
            '数据分析师', 'UI设计师', '测试工程师', '运维工程师'
        ]
        
        work_experiences = []
        # 生成1-3段工作经历
        for i in range(random.randint(1, 3)):
            start_date = datetime.now() - timedelta(days=random.randint(365, 365*5))
            end_date = start_date + timedelta(days=random.randint(365, 365*3))
            
            experience = {
                'company': random.choice(companies),
                'position': random.choice(positions),
                'start_date': start_date.strftime('%Y-%m-%d'),
                'end_date': end_date.strftime('%Y-%m-%d'),
                'description': f'负责公司项目开发与维护，参与团队协作，提升产品性能。这是第{i+1}段工作经历的详细描述。',
                'salary_range': random.choice(['8K-12K', '12K-15K', '15K-20K', '20K-25K', '25K-30K'])
            }
            work_experiences.append(experience)
            
        return work_experiences